package com.cskaoyan.javase.array._4operation._0traverse;

/**
 * 数组的遍历（traverse）是最最基本的操作，是进行数组中其它操作的基础。
 * 它的含义是依次访问（或输出）数组中的每一个元素。我们给出三种数组遍历的方式，以供参考。
 *
 * 这里以"依次访问,并输出"来写一下数组的遍历
 *
 * @since 14:58
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3};
        arr = null;
        // arr = new int[0];
        // 使用for循环遍历打印数组,快捷键 "数组名.fori"
        /*for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }*/
        // 提取出方法
        traverse8(arr);
    }

    // 初始版本,直接遍历打印元素
    public static void traverse(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }

    // 在上述版本的基础上,美化格式,希望输出的样式是: "[1, 2, 3]"
    public static void traverse2(int[] arr) {
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ", ");
        }
        System.out.println("]");
    }

    // 上述打印的样式是: "[1, 2, 3, ]" 需要去掉元素3后面的逗号和空格
    // 1.转义字符"\\b" 2.if判断

    // 1.退格方式实现
    public static void traverse3(int[] arr) {
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ", ");
        }
        System.out.println("\b\b]");
    }

    // 2.if判断方式实现
    public static void traverse4(int[] arr) {
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            // 如果是最后一个元素,就直接打印,不再加逗号了
            if (i == arr.length - 1) {
                System.out.print(arr[i]);
                // 这里已经打印了最后一个元素,循环应该终止
                break;
            }
            System.out.print(arr[i] + ", ");
        }
        System.out.println("]");
    }

    // 以上就完成了格式的优化,但是为了代码的严谨性,还需要考虑特殊值的输入
    // 比如: 1.null数组  2.长度为0

    // 改进一,使得方法能够接收长度为0的数组输入,并且给出友好的提示
    public static void traverse5(int[] arr) {
        // 判断一下输入数组的长度,如果是0,给出提示,终止方法
        // 判断"=="是更优的方式
        if (arr.length == 0) {
            System.out.println("您输入的数组长度为0,请重新输入!");
            return;
        }
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ", ");
        }
        System.out.println("\b\b]");
    }

    public static void traverse6(int[] arr) {
        // 判断一下输入数组的长度,如果是0,给出提示,终止方法
        if (arr.length != 0) {
            System.out.print("[");
            for (int i = 0; i < arr.length; i++) {
                System.out.print(arr[i] + ", ");
            }
            System.out.println("\b\b]");
            return;
        }
        System.out.println("您输入的数组长度为0,请重新输入!");
    }

    // 改进二: 使得方法能够接收null数组输入,并且单独给出友好的提示
    public static void traverse7(int[] arr) {
        // 判断输入的数组引用是否为null
        if (arr == null){
            System.out.println("您输入的数组是null,请重新输入!");
            return;
        }
        // 判断一下输入数组的长度,如果是0,给出提示,终止方法
        // 判断"=="是更优的方式
        if (arr.length == 0) {
            System.out.println("您输入的数组长度为0,请重新输入!");
            return;
        }
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ", ");
        }
        System.out.println("\b\b]");
    }

    // 改进三: 同时处理输入数组不正常的情况
    public static void traverse8(int[] arr) {
        // 一个if判断处理null和长度为0两种特殊情况
        if (arr == null || arr.length == 0){
            System.out.println("输入的数组不正常,请重新输入!");
            return;
        }
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ", ");
        }
        System.out.println("\b\b]");
    }
}
